package org.pps.gl.client.vue;

import java.util.ArrayList;

import org.pps.gl.client.GetInfoService;
import org.pps.gl.client.GetInfoServiceAsync;
import org.pps.gl.client.LoginInfo;
import org.pps.gl.client.Pps_gl;
import org.pps.gl.client.data.EtudeInfo;
import org.pps.gl.client.data.ExperienceInfo;
import org.pps.gl.client.events.RefreshUserEvent;
import org.pps.gl.client.events.RefreshUserEventHandler;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsDate;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Classe représentant la page de profil d'un utilisateur.
 * 
 */
public class Profil extends Composite implements ValueChangeHandler<String>,
		RefreshUserEventHandler {

	private DockLayoutPanel dockPanel;
	private Hyperlink hprlnkIdentite;
	private VerticalPanel flux;
	private PFL_Identite vueIdentite;
	private ScrollPanel sp;
	private Label titre;
	private Button btnAjoutEtude, btnAjoutExperience;
	public HorizontalPanel pnlAjoutEtude, pnlAjoutExperience;
	private ListBox listDebut, listFin;
	SuggestBox txtBoxNomEcole, txtBoxNomEntreprise, txtBoxSpecialite;
	private TextBox txtBoxDirection, txtBoxPoste;
	private ListBox lstBoxDomaine;
	private TextArea txtBoxDescription;
	private String ongletCourant;

	public Profil() {

		dockPanel = new DockLayoutPanel(Unit.PX);
		dockPanel.setSize("100%", "400px");
		VerticalPanel menu = new VerticalPanel();

		Pps_gl.getCm().addRefreshUserHandler(this);

		menu.setSize("100%", "");
		menu.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
		hprlnkIdentite = new Hyperlink("Identité", "identite");
		hprlnkIdentite.setStylePrimaryName("menuHyper");
		Hyperlink experience = new Hyperlink("Experience", "experience");
		experience.setStylePrimaryName("menuHyper");
		Hyperlink etudes = new Hyperlink("Etudes", "etudes");
		etudes.setStylePrimaryName("menuHyper");

		menu.add(hprlnkIdentite);
		menu.add(experience);
		menu.add(etudes);
		SimplePanel p = new SimplePanel();
		p.add(menu);
		p.setStylePrimaryName("navigation");

		pnlAjoutEtude = new HorizontalPanel();
		btnAjoutEtude = new Button("Ajouter");
		pnlAjoutExperience = new HorizontalPanel();
		btnAjoutExperience = new Button("Ajouter");

		titre = new Label("");
		titre.setStyleName("titre");

		sp = new ScrollPanel();
		flux = new VerticalPanel();
		sp.add(flux);
		sp.setSize("98%", "100%");

		dockPanel.addWest(p, 156);
		dockPanel.add(sp);
		initWidget(dockPanel);

		vueIdentite = new PFL_Identite();

		ongletCourant = "identite";
		flux.clear();
		vueIdentite.setInfo();
		titre.setText("Identité");
		flux.add(titre);
		flux.add(vueIdentite);

		History.addValueChangeHandler(this);
		ongletCourant = "identite";

		btnAjoutEtude.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (btnAjoutEtude.getText().equals("Ajouter"))
					displayTabAjoutEtude();
				else
					insertionEtude();
			}

		});

		btnAjoutExperience.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (btnAjoutExperience.getText().equals("Ajouter"))
					displayTabAjoutExperience();
				else
					insertionExperience();
			}

		});

	}

	/**
	 * Méthode qui insert une nouvelle expérience.
	 */
	protected void insertionExperience() {
		String debut, fin, nomEntreprise, direction, poste, description, domaine;
		boolean champManquant = false;

		// Nous vérifions si tous les champs sont bien spécifiés
		if (txtBoxNomEntreprise.getText().length() <= 0) {
			champManquant = true;
			txtBoxNomEntreprise.setStyleName("cadreErreur");
		}
		if (txtBoxDirection.getText().length() <= 0) {
			champManquant = true;
			txtBoxDirection.setStyleName("cadreErreur");
		}
		if (txtBoxPoste.getText().length() <= 0) {
			champManquant = true;
			txtBoxPoste.setStyleName("cadreErreur");
		}
		if (listDebut.getSelectedIndex() == 0
				|| listFin.getSelectedIndex() == 0
				|| listFin.getSelectedIndex() > listFin.getSelectedIndex()) {
			champManquant = true;
			listDebut.setStyleName("cadreErreur");
			listFin.setStyleName("cadreErreur");
		}

		// S'il n'y a aucun champ manquant
		if (!champManquant) {

			debut = listDebut.getItemText(listDebut.getSelectedIndex());
			fin = listFin.getItemText(listFin.getSelectedIndex());
			nomEntreprise = txtBoxNomEntreprise.getText();
			direction = txtBoxDirection.getText();
			poste = txtBoxPoste.getText();
			description = txtBoxDescription.getText();
			domaine = lstBoxDomaine.getValue(lstBoxDomaine.getSelectedIndex());

			GetInfoServiceAsync infoService = GWT.create(GetInfoService.class);
			infoService.addExperience(LoginInfo.getCurrentUser()
					.getEmailAddress(), debut, fin, nomEntreprise, direction,
					poste, description, domaine, new AsyncCallback<Boolean>() {

						@Override
						public void onSuccess(Boolean result) {
							// On rafraîchie les données sur la page
							Pps_gl.getCm().refresh();
							GWT.log("Experience insérée.");
						}

						@Override
						public void onFailure(Throwable caught) {
							GWT.log("Erreur d'insertion d'expérience.");
						}
					});
		}

	}

	/**
	 * Méthode qui insert les nouvelles études dans le datastore.
	 */
	protected void insertionEtude() {
		String debut, fin, nomEcole, specialite;
		boolean champManquant = false;

		// Nous vérifions si tous les champs sont bien spécifiés
		if (txtBoxNomEcole.getText().length() <= 0) {
			champManquant = true;
			txtBoxNomEcole.setStyleName("cadreErreur");
		}
		if (txtBoxSpecialite.getText().length() <= 0) {
			champManquant = true;
			txtBoxSpecialite.setStyleName("cadreErreur");
		}
		if (listDebut.getSelectedIndex() == 0
				|| listFin.getSelectedIndex() == 0
				|| listFin.getSelectedIndex() > listFin.getSelectedIndex()) {
			champManquant = true;
			listDebut.setStyleName("cadreErreur");
			listFin.setStyleName("cadreErreur");
		}

		// S'il n'y a aucun champ manquant
		if (!champManquant) {

			debut = listDebut.getItemText(listDebut.getSelectedIndex());
			fin = listFin.getItemText(listFin.getSelectedIndex());
			nomEcole = txtBoxNomEcole.getText();
			specialite = txtBoxSpecialite.getText();

			GetInfoServiceAsync infoService = GWT.create(GetInfoService.class);
			infoService.addEtude(LoginInfo.getCurrentUser().getEmailAddress(),
					debut, fin, nomEcole, specialite,
					new AsyncCallback<Boolean>() {

						@Override
						public void onSuccess(Boolean result) {
							// On rafraîchie les données sur la page
							Pps_gl.getCm().refresh();
							System.out.println("Etude insérée.");
						}

						@Override
						public void onFailure(Throwable caught) {
							System.err.println("Erreur d'insertion d'étude.");
						}
					});
		}
	}

	/**
	 * Méthode qui va afficher le tableau permettant d'ajouter des études.
	 */
	protected void displayTabAjoutEtude() {
		FlexTable tab = new FlexTable();
		tab.setStyleName("profilMarge");

		Label lblDebut, lblFin, lblNomEcole, lblSpecialite;
		lblNomEcole = new Label("Ecole ");
		lblSpecialite = new Label("Spécialité ");

		MultiWordSuggestOracle oracleE = new MultiWordSuggestOracle();
		ArrayList<String> schools = LoginInfo.getCurrentUser().getAllSchools();
		if (schools != null)
			oracleE.addAll(schools);
		txtBoxNomEcole = new SuggestBox(oracleE);
		// txtBoxNomEcole = new TextBox();
		MultiWordSuggestOracle oracleS = new MultiWordSuggestOracle();
		ArrayList<String> spe = LoginInfo.getCurrentUser().getAllSpecialite();
		if (spe != null)
			oracleS.addAll(spe);
		txtBoxSpecialite = new SuggestBox(oracleS);

		lblDebut = new Label("Début ");
		tab.setWidget(0, 0, lblDebut);

		listDebut = new ListBox();
		tab.setWidget(0, 1, listDebut);
		listDebut.setSize("80px", "26px");
		listDebut.addItem("");

		// l'année en cours
		int y = JsDate.create().getFullYear();

		for (Integer i = y; i >= y - 80; i--)
			listDebut.addItem(i.toString());

		// on attend d'avoir choisi la date de début pour proposer le choix de
		// la fin
		listDebut.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				int y = JsDate.create().getFullYear();
				int yy = y - listDebut.getSelectedIndex() + 1;
				listFin.clear();
				listFin.addItem("");
				listFin.addItem("en cours");
				for (Integer i = y; i >= yy; i--)
					listFin.addItem(i.toString());
			}
		});
		lblFin = new Label("Fin ");
		tab.setWidget(1, 0, lblFin);

		listFin = new ListBox();
		tab.setWidget(1, 1, listFin);
		listFin.setSize("80px", "26px");
		listFin.addItem("");
		listFin.addItem("en cours");
		tab.setWidget(2, 0, lblNomEcole);
		tab.setWidget(2, 1, txtBoxNomEcole);
		tab.setWidget(3, 0, lblSpecialite);
		tab.setWidget(3, 1, txtBoxSpecialite);
		tab.setSize("291px", "42px");
		pnlAjoutEtude.clear();

		btnAjoutEtude.setText("Valider");
		pnlAjoutEtude.setSize("472px", "130px");
		pnlAjoutEtude.add(tab);
		tab.getCellFormatter().setHorizontalAlignment(0, 1,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(1, 1,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(2, 1,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(3, 1,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(0, 0,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(1, 0,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(2, 0,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getCellFormatter().setHorizontalAlignment(3, 0,
				HasHorizontalAlignment.ALIGN_LEFT);
		tab.getRowFormatter().setVerticalAlign(0,
				HasVerticalAlignment.ALIGN_MIDDLE);
		pnlAjoutEtude.add(btnAjoutEtude);
		pnlAjoutEtude.setCellVerticalAlignment(btnAjoutEtude,
				HasVerticalAlignment.ALIGN_MIDDLE);

		Button btnAnnulerAjout = new Button("Annuler");
		pnlAjoutEtude.add(btnAnnulerAjout);
		pnlAjoutEtude.setCellVerticalAlignment(btnAnnulerAjout,
				HasVerticalAlignment.ALIGN_MIDDLE);

		btnAnnulerAjout.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				hideAjoutPanel();
			}

		});
	}

	/**
	 * Pour ajouter une expérience
	 */
	public void displayTabAjoutExperience() {
		FlexTable tab = new FlexTable();
		tab.setStyleName("profilMarge");

		Label lblDebut, lblFin, lblNomEntreprise, lblDirection, lblPoste, lblDescription, lblDomaine;

		lblDebut = new Label("Début ");
		lblFin = new Label("Fin ");
		lblNomEntreprise = new Label("Entreprise ");
		lblDirection = new Label("Direction ");
		lblPoste = new Label("Poste ");
		lblDescription = new Label("Description ");
		lblDomaine = new Label("Domaine d'activité");

		txtBoxPoste = new TextBox();
		MultiWordSuggestOracle oracleEE = new MultiWordSuggestOracle();
		ArrayList<String> ent = LoginInfo.getCurrentUser().getAllEntreprise();
		if (ent != null)
			oracleEE.addAll(ent);
		txtBoxNomEntreprise = new SuggestBox(oracleEE);
		// txtBoxNomEntreprise = new TextBox();
		txtBoxDirection = new TextBox();
		// liste déroulante du domaine d'activité
		lstBoxDomaine = new ListBox();
		lstBoxDomaine.addItem("Autre");
		lstBoxDomaine.addItem("Agriculture, agro, environnement");
		lstBoxDomaine.addItem("Arts - Arts appliqués");
		lstBoxDomaine.addItem("Assurance, Banque, Immobilier");
		lstBoxDomaine.addItem("Commerce, vente, distribution");
		lstBoxDomaine.addItem("Communication, Culture");
		lstBoxDomaine.addItem("Droit, Sc Politique, Economie");
		lstBoxDomaine.addItem("Gestion, management");
		lstBoxDomaine.addItem("Hôtellerie-restauration, tourisme");
		lstBoxDomaine.addItem("Informatique, télécom");
		lstBoxDomaine.addItem("Lettres et Sciences humaines");
		lstBoxDomaine.addItem("Santé - Sports");
		lstBoxDomaine.addItem("Sciences, technologies");
		lstBoxDomaine.addItem("Secrétariat - Assistanat");
		lstBoxDomaine.addItem("Transports, logistique");
		// fin de la liste déroulante
		txtBoxDescription = new TextArea();
		txtBoxDescription.setVisibleLines(3);

		listDebut = new ListBox();
		listDebut.setSize("80px", "26px");
		listDebut.addItem("");

		// l'année en cours
		int y = JsDate.create().getFullYear();

		for (Integer i = y; i >= y - 80; i--)
			listDebut.addItem(i.toString());

		listFin = new ListBox();
		listFin.setSize("80px", "26px");
		listFin.addItem("");
		listFin.addItem("en cours");
		// on attend d'avoir choisi la date de début pour proposer le choix de
		// la fin
		listDebut.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				int y = JsDate.create().getFullYear();
				int yy = y - listDebut.getSelectedIndex() + 1;
				listFin.clear();
				listFin.addItem("");
				listFin.addItem("en cours");
				for (Integer i = y; i >= yy; i--)
					listFin.addItem(i.toString());
			}
		});

		tab.setWidget(0, 0, lblDebut);
		tab.setWidget(0, 1, listDebut);
		tab.setWidget(1, 0, lblFin);
		tab.setWidget(1, 1, listFin);
		tab.setWidget(2, 0, lblPoste);
		tab.setWidget(2, 1, txtBoxPoste);
		tab.setWidget(3, 0, lblNomEntreprise);
		tab.setWidget(3, 1, txtBoxNomEntreprise);
		tab.setWidget(4, 0, lblDirection);
		tab.setWidget(4, 1, txtBoxDirection);
		tab.setWidget(5, 0, lblDomaine);
		tab.setWidget(5, 1, lstBoxDomaine);
		tab.setWidget(6, 0, lblDescription);
		tab.setWidget(6, 1, txtBoxDescription);

		Button btnAnnulerAjout = new Button("Annuler");
		tab.setSize("100%", "100%");
		pnlAjoutExperience.clear();

		btnAjoutExperience.setText("Valider");
		pnlAjoutExperience.setSize("430px", "130px");
		pnlAjoutExperience.add(tab);
		pnlAjoutExperience.add(btnAnnulerAjout);
		pnlAjoutExperience.add(btnAjoutExperience);
		pnlAjoutExperience.setCellVerticalAlignment(btnAnnulerAjout,
				HasVerticalAlignment.ALIGN_MIDDLE);
		pnlAjoutExperience.setCellVerticalAlignment(btnAjoutExperience,
				HasVerticalAlignment.ALIGN_MIDDLE);

		btnAnnulerAjout.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				hideAjoutExperiencePanel();
			}

		});
	}

	@Override
	public void onValueChange(ValueChangeEvent<String> event) {
		if (event.getValue().equals("identite")) {
			ongletCourant = "identite";
			flux.clear();
			vueIdentite.setInfo();
			titre.setText("Identité");
			flux.add(titre);
			flux.add(vueIdentite);
		} else if (event.getValue().equals("experience")) {
			afficherExperiences();
			ongletCourant = "experience";

		} else if (event.getValue().equals("etudes")) {
			afficherEtudes();
			ongletCourant = "etudes";
		}
	}

	/**
	 * Méthode qui affiche les experiences d'un utilisateur.
	 */
	public void afficherExperiences() {
		flux.clear();
		titre.setText("Expérience");

		pnlAjoutExperience.add(btnAjoutExperience);
		pnlAjoutExperience.setCellHorizontalAlignment(btnAjoutExperience,
				HasHorizontalAlignment.ALIGN_RIGHT);

		flux.add(titre);
		flux.add(pnlAjoutExperience);
		flux.setCellHorizontalAlignment(pnlAjoutExperience,
				HasHorizontalAlignment.ALIGN_RIGHT);

		ArrayList<ExperienceInfo> experiences = LoginInfo.getCurrentUser()
				.getUserInfo().getSesExperiences();

		if (0 != experiences.size()) {
			for (ExperienceInfo exp : experiences) {
				flux.add(new PFL_Experience(exp.getPeriode(), exp
						.getNomEntreprise(), exp.getDirection(),
						exp.getPoste(), exp.getDescription(), exp.getDomaine(),
						exp.getExperienceId(), this));
			}
		} else {
			VerticalPanel vp = new VerticalPanel();
			// vp.setStyleName("gwt-panel-etude");
			Label lblErr = new Label(
					"Aucune expérience professionelle enregistrée.");
			vp.add(lblErr);
			vp.setCellHorizontalAlignment(lblErr,
					HasHorizontalAlignment.ALIGN_CENTER);
			vp.setCellVerticalAlignment(lblErr,
					HasVerticalAlignment.ALIGN_MIDDLE);
			vp.setSize("300px", "90px");
			flux.add(vp);
		}

	}

	public void afficherEtudes() {
		flux.clear();
		titre.setText("Etudes");

		pnlAjoutEtude.add(btnAjoutEtude);
		pnlAjoutEtude.setCellHorizontalAlignment(btnAjoutEtude,
				HasHorizontalAlignment.ALIGN_RIGHT);

		flux.add(titre);
		flux.add(pnlAjoutEtude);
		flux.setCellHorizontalAlignment(pnlAjoutEtude,
				HasHorizontalAlignment.ALIGN_RIGHT);

		ArrayList<EtudeInfo> etudes = LoginInfo.getCurrentUser().getUserInfo()
				.getSesEtudes();

		if (0 != etudes.size()) {
			for (EtudeInfo et : etudes) {
				flux.add(new PFL_Etude(et.getPeriode(), et.getNomEcole(), et
						.getSpecialite(), et.getIdEtude(), this));
			}
		} else {
			VerticalPanel vp = new VerticalPanel();
			// vp.setStyleName("gwt-panel-etude");
			Label lblErr = new Label("Aucune étude enregistrée.");
			vp.add(lblErr);
			vp.setCellHorizontalAlignment(lblErr,
					HasHorizontalAlignment.ALIGN_CENTER);
			vp.setCellVerticalAlignment(lblErr,
					HasVerticalAlignment.ALIGN_MIDDLE);
			vp.setSize("300px", "90px");
			flux.add(vp);
		}
	}

	/**
	 * Cache le panel d'ajout d'étude.
	 */
	public void hideAjoutPanel() {
		pnlAjoutEtude.clear();
		pnlAjoutEtude.setStyleName("");
		pnlAjoutEtude.setSize("400px", "100%");
		pnlAjoutEtude.add(btnAjoutEtude);
		btnAjoutEtude.setText("Ajouter");
		pnlAjoutEtude.setCellHorizontalAlignment(btnAjoutEtude,
				HasHorizontalAlignment.ALIGN_RIGHT);
	}

	public void hideAjoutExperiencePanel() {
		pnlAjoutExperience.clear();
		pnlAjoutExperience.setStyleName("");
		pnlAjoutExperience.setSize("400px", "100%");
		pnlAjoutExperience.add(btnAjoutExperience);
		btnAjoutExperience.setText("Ajouter");
		pnlAjoutExperience.setCellHorizontalAlignment(btnAjoutExperience,
				HasHorizontalAlignment.ALIGN_RIGHT);

	}

	/**
	 * 
	 */
	public void onRefresh(RefreshUserEvent refreshEvent) {
		if (ongletCourant.equals("etudes")) {
			hideAjoutPanel();
			afficherEtudes();
		} else if (ongletCourant.equals("experience")) {
			hideAjoutExperiencePanel();
			afficherExperiences();
		} else {
			ongletCourant = "identite";
			flux.clear();
			vueIdentite.setInfo();
			titre.setText("Identité");
			flux.add(titre);
			flux.add(vueIdentite);
		}
	}

}
